home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / progutil / stdwin.zoo / atari / document.c < prev    next >
C/C++ Source or Header  |  1990-03-29  |  6KB  |  320 lines

  1. #include "window.h"
  2. #include "style.h"
  3. #include "trees.h"
  4. #include "atari_proto.h"
  5. #undef P
  6.  
  7. void    setclip () ;
  8.  
  9. extern int    vdi_handle ;
  10.  
  11. extern bool    mousedown ;
  12.  
  13. void
  14. wchange (win, left, top, right, bottom)
  15.     WINDOW    *win ;
  16.     int    left ;
  17.     int    top ;
  18.     int    right ;
  19.     int    bottom ;
  20. {
  21.     if (win == NULL)
  22.         return ;
  23.  
  24.     if (left < win->orgh)
  25.         left = win->orgh ;
  26.     if (top < win->orgv)
  27.         top = win->orgv ;
  28.     if (right > win->orgh + win->width)
  29.         right = win->orgh + win->width ;
  30.     if (bottom > win->orgv + win->height)
  31.         bottom = win->orgv + win->height ;
  32.  
  33.     if (left >= right || top >= bottom)
  34.         return ;
  35.  
  36.     if (!win->needupdate) {
  37.         /* No changed area; assign paramters */
  38.         win->needupdate = TRUE ;
  39.         win->left = left ;
  40.         win->top = top ;
  41.         win->right = right ;
  42.         win->bottom = bottom ;
  43.     }
  44.     else {
  45.         /* Already a changed area; calculate new rectangle */
  46.         if (left < win->left)
  47.             win->left = left ;
  48.         if (top < win->top)
  49.             win->top = top ;
  50.         if (right > win->right)
  51.             win->right = right ;
  52.         if (bottom > win->bottom)
  53.             win->bottom = bottom ;
  54.     }
  55. }
  56.  
  57. void
  58. wgetchange (win, pleft, ptop, pright, pbottom)
  59.     WINDOW    *win ;
  60.     int    *pleft ;
  61.     int    *ptop ;
  62.     int    *pright ;
  63.     int    *pbottom ;
  64. {
  65.     *pleft = *ptop = *pright = *pbottom = 0 ;
  66.  
  67.     if (win == NULL) {
  68.         wdebug ("wgetchange: illegal window pointer") ;
  69.         return ;
  70.     }
  71.  
  72.     if (win->needupdate) {
  73.         *pleft = win->left ;
  74.         *ptop = win->top ;
  75.         *pright = win->right ;
  76.         *pbottom = win->bottom ;
  77.     }
  78. }
  79.  
  80. void
  81. wupdate (win)
  82.     WINDOW    *win ;
  83. {
  84.     if (win == NULL) {
  85.         wdebug ("wupdate: illegal window pointer") ;
  86.         return ;
  87.     }
  88.     if (win->needupdate) {
  89.         int    handle ;
  90.         int    changed[4] ;
  91.         int    draw[4] ;
  92.     
  93.         wgetchange (win, &changed[0], &changed[1], &changed[2],
  94.                                 &changed[3]) ;
  95.  
  96.         handle = win->handle ;
  97.         if (!wind_get (handle, WF_FIRSTXYWH, &draw[0], &draw[1],
  98.                             &draw[2], &draw[3])) {
  99.             wdebug ("wupdate: wind_get") ;
  100.             return ;
  101.         }
  102.         while (draw[2] && draw[3]) {
  103.             SCRTODOC (win, draw[0], draw[1], draw[0], draw[1]) ;
  104.             draw[2] += draw[0] ;
  105.             draw[3] += draw[1] ;
  106.  
  107.             if (intersect (changed, draw)) {
  108.                 wbegindrawing (win) ;
  109.                 setclip (win, 1, draw[0], draw[1], draw[2],
  110.                                 draw[3]) ;
  111.                 werase (draw[0], draw[1], draw[2], draw[3]) ;
  112.                 if (win->drawproc != NULL)
  113.                     (*win->drawproc) (win, draw[0], draw[1],
  114.                             draw[2],draw[3]) ;
  115.                 setclip (win, 0, draw[0], draw[1], draw[2],
  116.                                 draw[3]) ;
  117.                 wenddrawing (win) ;
  118.             }
  119.             if (!wind_get (handle, WF_NEXTXYWH, &draw[0], &draw[1],
  120.                             &draw[2], &draw[3])) {
  121.                 wdebug ("wupdate: wind_get") ;
  122.                 return ;
  123.             }
  124.         }
  125.         win->needupdate = FALSE ;
  126.     }
  127. }
  128.  
  129. void
  130. wsetorigin (win, h, v)
  131.     WINDOW    *win ;
  132.     int    h ;
  133.     int    v ;
  134. {
  135.     extern    bool getsrcdiff () ;
  136.     int    l ;
  137.     int    t ;
  138.     int    r ;
  139.     int    b ;
  140.     int    dh ;
  141.     int    dv ;
  142.     int    src[4] ;
  143.     int    diff[4][4] ;
  144.     int    nr_diff ;
  145.     int    i ;
  146.  
  147.     if (win == NULL) {
  148.         wdebug ("wsetorigin: illegal window pointer") ;
  149.         return ;
  150.     }
  151.  
  152.     if (h > win->doc_width - win->width)
  153.         h = win->doc_width - win->width ;
  154.  
  155.     if (h < 0)
  156.         h = 0 ;
  157.  
  158.     if (v > win->doc_height - win->height)
  159.         v = win->doc_height - win->height ;
  160.  
  161.     if (v < 0)
  162.         v = 0 ;
  163.  
  164.     if (h == win->orgh && v == win->orgv)
  165.         return ;
  166.  
  167.     rmcaret () ;
  168.  
  169.     l = win->orgh ;
  170.     r = win->orgh + win->width ;
  171.     t = win->orgv ;
  172.     b = win->orgv + win->height ;
  173.     dh = win->orgh - h ;
  174.     dv = win->orgv - v ;
  175.  
  176.     if (dh > 0)
  177.         l -= dh ;
  178.     if (dh < 0)
  179.         r -= dh ;
  180.     if (dv > 0)
  181.         t -= dv ;
  182.     if (dv < 0)
  183.         b -= dv ;
  184.  
  185.     if (getsrcdiff (win, l, t, r, b, dh, dv, src, diff, &nr_diff)) {
  186.         scrollby (win, src[0], src[1], src[2], src[3], dh, dv) ;
  187.     }
  188.  
  189.     win->orgh = h ;
  190.     win->orgv = v ;
  191.  
  192.     for (i = 0 ; i < nr_diff ; i++) {
  193.         wchange (win, diff[i][0], diff[i][1],
  194.                 diff[i][2], diff[i][3]) ;
  195.     }
  196.  
  197.     showcaret () ;
  198.  
  199.     wupdate (win) ;
  200.  
  201.     setscrollbars (win) ;
  202. }
  203.  
  204. void
  205. wgetwinorigin (win, ph, pv)
  206.     WINDOW    *win ;
  207.     int    *ph ;
  208.     int    *pv ;
  209. {
  210.     *ph = win->orgh ;
  211.     *pv = win->orgv ;
  212. }
  213.  
  214. void
  215. wsetdocsize (win, width, height)
  216.     WINDOW    *win ;
  217.     int    width ;
  218.     int    height ;
  219. {
  220.     if (win == NULL) {
  221.         wdebug ("wsetdocsize: illegal window pointer") ;
  222.         return ;
  223.     }
  224.     win->doc_width = width ;
  225.     win->doc_height = height ;
  226.  
  227.     setscrollbars (win) ;
  228. }
  229.  
  230. void
  231. wshow (win, left, top, right, bottom)
  232.     WINDOW    *win ;
  233.     int    left ;
  234.     int    top ;
  235.     int    right ;
  236.     int    bottom ;
  237. {
  238.     int    width ;
  239.     int    height ;
  240.     int    orgh = win->orgh ;
  241.     int    orgv = win->orgv ;
  242.     int    extrah ;
  243.     int    extrav ;
  244.  
  245.     if (mousedown)
  246.         return ;
  247.     
  248.     wgetwinsize (win, &width, &height) ;
  249. /*wdebug ("     lef top rig bot|rect %3d %3d %3d %3d|wind %3d %3d %3d %3d",
  250.     left, top, right, bottom, orgh, orgv, orgh + width, orgv + height) ;
  251. */    if ((left >= orgh) &&
  252.         (top >= orgv) &&
  253.         (right <= orgh + width) &&
  254.         (bottom <= orgv + height)) {
  255.         return ; /* Already visible */
  256.     }
  257.  
  258.     extrah = (width - (right - left)) / 2 ;
  259.     if (extrah < 0)
  260.         extrah = 0 ;
  261.  
  262.     extrav = (height - (bottom - top)) / 2 ;
  263.     if (extrav < 0)
  264.         extrav = 0 ;
  265.  
  266. /*    wdebug ("left %d orgh %d right %d width %d extrah %d",
  267.         left, orgh, right, width, extrah) ;
  268. */    if (left < orgh)
  269.         orgh = left - extrah ;
  270.     else if (right > orgh + width)
  271.         orgh = right - width + extrah ;
  272. /*    wdebug ("orgh %d", orgh) ;
  273.  
  274.     wdebug ("top %d orgv %d bottom %d height %d extrav %d",
  275.         top, orgv, bottom, height, extrav) ;
  276. */    if (top < orgv)
  277.         orgv = top - extrav ;
  278.     else if (bottom > orgv + height)
  279.         orgv = bottom - height + extrav ;
  280. /*    wdebug ("orgv %d", orgv) ;
  281. */
  282.     wsetorigin (win, orgh, orgv) ;
  283. }
  284.  
  285. void
  286. setclip (win, flag, left, top, right, bottom)
  287.     WINDOW    *win ;
  288.     int    flag ;
  289.     int    left ;
  290.     int    top ;
  291.     int    right ;
  292.     int    bottom ;
  293. {
  294.     int    scr_rect[4] ;
  295.  
  296.     DOCTOSCR (win, left, top, scr_rect[0], scr_rect[1]) ;
  297.     DOCTOSCR (win, right - 1, bottom - 1, scr_rect[2], scr_rect[3]) ;
  298.  
  299.     vs_clip (vdi_handle, flag, scr_rect) ;
  300. }
  301.  
  302. int
  303. intersect (src, dest)
  304.     int    *src ;
  305.     int    *dest ;
  306. {
  307.     if (src[0] > dest[0])
  308.         dest[0] = src[0] ;
  309.     if (src[1] > dest[1])
  310.         dest[1] = src[1] ;
  311.     if (src[2] < dest[2])
  312.         dest[2] = src[2] ;
  313.     if (src[3] < dest[3])
  314.         dest[3] = src[3] ;
  315.  
  316.     if (dest[0] >= dest[2] || dest[1] >= dest[3])
  317.         return FALSE ;
  318.     return TRUE ;
  319. }
  320.